package la.iok.hzsvn.lewin.movie.obs;

import com.obs.services.model.Multipart;
import com.obs.services.model.SpecialParamEnum;
import la.iok.hzsvn.lewin.movie.model.ObsSignedUrl;
import la.iok.hzsvn.lewin.movie.model.SignUrlParam;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

import java.io.File;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

public interface ObsService {
    /**
     * 获取访问key
     * @param enableWrite 是否需要写权限
     * @return 访问key
     */
    AccessKey getAccessKey(boolean enableWrite);
    ObsSignedUrl signUrlPut(@Nullable String key);

    /**
     * 签名put类型的url并且携带参数
     * @param key 对象key
     * @param params 参数
     * @return 签名url结果
     */
    ObsSignedUrl signUrlPut(@Nullable String key, @Nullable Map<String,Object> params);
    ObsSignedUrl signUrlGet(@Nullable String key);

    /**
     * 签名POST请求并携带特殊参数
     * @param key 对象key
     * @param specialParamEnum 特殊参数
     * @return 签名url结果
     */
    ObsSignedUrl signUrlPost(@Nullable String key, @Nullable SpecialParamEnum specialParamEnum);

    /**
     * 签名POST请求并携带请求参数
     * @param key
     * @param headers 请求头参数
     * @param params
     * @return
     */
    ObsSignedUrl signUrlPost(@Nullable String key, @Nullable Map<String, String> headers, @Nullable Map<String,Object> params);

    /**
     * 上传文件。100M以内的文件单个直接上传,大于100M的文件分段上传
     * @param storePath 文件存储路径
     * @param file 文件对象
     */
    void uploadFile(@NotNull String storePath, @NotNull File file);

    /**
     * 下载文件
     * @param key 对象的key
     * @param os 下载的目标流
     */
    void downloadFile(@NotNull String key, @NotNull OutputStream os);

    /**
     * 删除文件对象
     * @param key 对象的key
     */
    void deleteFile(@NotNull String key);

    /**
     * 判断是否存在对象
     * @param key 对象的key
     * @return 存在返回true否则false
     */
    boolean exist(@NotNull String key);

    /**
     * 获取文件大小
     * @param key 对象的key
     * @return 文件大小
     */
    long fileLength(@NotNull String key);

    /**
     * 签名url
     * @param param 请求参数
     * @return 签名url
     */
    ObsSignedUrl signUrl(SignUrlParam param);

    List<Multipart> loadUploadPart(String key, String uploadId);
}
